package com.metadata_system.api_server.ai_server;

import com.metadata_system.ai.request.MetadataEdgeListRequest;
import com.metadata_system.ai.request.MetadataListRequest;
import com.metadata_system.ai.request.MetadataNodeListRequest;
import com.metadata_system.ai.request.MetadataViewListRequest;
import com.metadata_system.ai.service.MetadataService;
import com.metadata_system.api.annotations.AiSystemApiCheck;
import com.metadata_system.common.dto.ApiResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/api/ai-server/v001/Metadata/")
@RestController("aiServerDatabaseController")
public class MetadataController {
    @Autowired
    private MetadataService metadataService;


    /**
     * @api {post} /api/ai-server/v001/Metadata/getList 01.元模型-列表
     * @apiName 01.元模型-列表
     * @apiGroup 01.元模型
     * @apiVersion 1.0.0
     *
     * @apiHeader {String} ApiKey 平台ApiKey
     * @apiHeader {String} Timestamp 时间戳
     * @apiHeader {String} Sign 请求签名
     * @apiHeader {String} Username 用户名(在后台系统查看需要开启【模型工具访问】权限)
     * @apiParam {String} [updatedTime=2025-09-23,2025-09-30] 查询时间段,格式:yyyy-MM-dd,yyyy-MM-dd(可选)
     * @apiParam {String} [page=1] 页码(可选,默认:1)
     * @apiParam {String} [pageSize=100] 每页数量(可选,默认:100)
     * @apiParam {String} [sortProp=updatedTime] 排序字段:updatedTime(可选,默认:updatedTime)
     * @apiParam {String} [sortOrder=desc] 排序顺序:asc/desc(可选,默认:desc)
     *
     * @apiError {Number} code 错误码，非0表示失败
     * @apiError {String} message 错误信息
     *
     * @apiSuccessExample {json} 成功响应:
     * HTTP/1.1 200 OK
     * {
     *     "message": "",
     *     "code": 0,
     *     "data": {
     *         "total": 1,                                          // 元模型-列表-总数量
     *         "deleteIdList": [3,4],                               // 元模型-删除-id列表
     *         "list": [                                            // 元模型-列表
     *             {
     *                 "id": 2,                                      // 元模型-id
     *                 "name": "皮卡运输车-元模型",                   // 元模型-名称
     *                 "shortName": "皮卡运",                        // 元模型-简称
     *                 "dataTotal": 48,                              // 元模型-数据数量
     *                 "createdTime": "2025-08-10 08:37:39",         // 元模型-创建时间
     *                 "updatedTime": "2025-08-10 08:37:39"          // 元模型-更新时间
     *             }
     *         ]
     *     },
     *     "extendInfo": [
     *     ],
     *     "timeStamp": 1758584610319,
     *     "execTime": 0,
     *     "error": false
     * }
     */
    @RequestMapping("getList")
    @AiSystemApiCheck
    public ApiResult getList(
            @RequestParam(required = false) String updatedTime,
            @RequestParam(required = false, defaultValue = "1") Integer page,
            @RequestParam(required = false, defaultValue = "100") Integer pageSize,
            @RequestParam(required = false, defaultValue = "id") String sortProp,
            @RequestParam(required = false, defaultValue = "desc") String sortOrder
    ) {
        return metadataService.getList(MetadataListRequest.builder()
                .updatedTime(updatedTime)
                .page(page)
                .pageSize(pageSize)
                .sortProp(sortProp)
                .sortOrder(sortOrder)
                .build());
    }



    /**
     * @api {post} /api/ai-server/v001/Metadata/getViewList 02.元模型视图-列表
     * @apiName 02.元模型视图-列表
     * @apiGroup 01.元模型
     * @apiVersion 1.0.0
     *
     * @apiHeader {String} ApiKey 平台ApiKey
     * @apiHeader {String} Timestamp 时间戳
     * @apiHeader {String} Sign 请求签名
     * @apiHeader {String} Username 用户名(在后台系统查看需要开启【模型工具访问】权限)
     * @apiParam {String} [updatedTime=2025-09-23,2025-09-30] 查询时间段,格式:yyyy-MM-dd,yyyy-MM-dd(可选)
     * @apiParam {String} [metadataIds=15,16] 元模型-id列表,多个id用逗号隔开(可选)
     * @apiParam {String} [page=1] 页码(可选,默认:1)
     * @apiParam {String} [pageSize=100] 每页数量(可选,默认:100)
     * @apiParam {String} [sortProp=updatedTime] 排序字段:updatedTime(可选,默认:updatedTime)
     * @apiParam {String} [sortOrder=desc] 排序顺序:asc/desc(可选,默认:desc)
     *
     * @apiError {Number} code 错误码，非0表示失败
     * @apiError {String} message 错误信息
     *
     * @apiSuccessExample {json} 成功响应:
     * HTTP/1.1 200 OK
     * {
     *     "message": "",
     *     "code": 0,
     *     "data": {
     *         "total": 13,                                          // 元模型-视图-列表-总数量
     *         "deleteIdList": [],                                  // 元模型-视图-删除-id列表
     *         "list": [
     *             {
     *                 "id": 4,                                      // 元模型-视图-id
     *                 "metadataId": 2,                              // 元模型-id
     *                 "name": "默认-视图",                          // 元模型-视图-名称
     *                 "shortName": "默认",                          // 元模型-视图-简称
     *                 "nodeTotal": 0,                               // 元模型-视图-节点数量
     *                 "edgeTotal": 0,                               // 元模型-视图-边数量
     *                 "createdTime": "2025-08-11 19:17:26",         // 元模型-视图-创建时间
     *                 "updatedTime": "2025-08-11 19:17:26"         // 元模型-视图-更新时间
     *             },....
     *         ]
     *     },
     *     "extendInfo": [
     *     ],
     *     "timeStamp": 1758584687966,
     *     "execTime": 0,
     *     "error": false
     * }
     */
    @RequestMapping("getViewList")
    @AiSystemApiCheck
    public ApiResult getViewList(
            @RequestParam(required = false) String metadataIds,
            @RequestParam(required = false) String updatedTime,
            @RequestParam(required = false, defaultValue = "1") Integer page,
            @RequestParam(required = false, defaultValue = "100") Integer pageSize,
            @RequestParam(required = false, defaultValue = "updatedTime") String sortProp,
            @RequestParam(required = false, defaultValue = "desc") String sortOrder
    ) {
        return metadataService.getViewList(MetadataViewListRequest.builder()
                .metadataIds(metadataIds)
                .updatedTime(updatedTime)
                .page(page)
                .pageSize(pageSize)
                .sortProp(sortProp)
                .sortOrder(sortOrder)
                .build());
    }


    /**
     * @api {post} /api/ai-server/v001/Metadata/getNodeList 03.元模型节点-列表
     * @apiName 03.元模型节点-列表
     * @apiGroup 01.元模型
     * @apiVersion 1.0.0
     *
     * @apiHeader {String} ApiKey 平台ApiKey
     * @apiHeader {String} Timestamp 时间戳
     * @apiHeader {String} Sign 请求签名
     * @apiHeader {String} Username 用户名(在后台系统查看需要开启【模型工具访问】权限)
     * @apiParam {String} [updatedTime=2025-09-23,2025-09-30] 查询时间段,格式:yyyy-MM-dd,yyyy-MM-dd(可选)
     * @apiParam {String} [metadataIds=15,16] 元模型-id列表,多个id用逗号隔开(可选)
     * @apiParam {String} [metadataViewIds=3,23] 元模型-视图-id列表,多个id用逗号隔开(可选)
     * @apiParam {String} [page=1] 页码(可选,默认:1)
     * @apiParam {String} [pageSize=100] 每页数量(可选,默认:100)
     * @apiParam {String} [sortProp=updatedTime] 排序字段:updatedTime(可选,默认:updatedTime)
     * @apiParam {String} [sortOrder=desc] 排序顺序:asc/desc(可选,默认:desc)
     *
     * @apiError {Number} code 错误码，非0表示失败
     * @apiError {String} message 错误信息
     *
     * @apiSuccessExample {json} 成功响应:
     * HTTP/1.1 200 OK
     * {
     *     "message": "",
     *     "code": 0,
     *     "data": {
     *         "total": 13,                                          // 元模型-视图-列表-总数量
     *         "deleteIdList": [],                                  // 元模型-视图-删除-id列表
     *         "list": [
     *             {
     *                 "id": 4,                                      // 元模型-视图-id
     *                 "metadataId": 2,                              // 元模型-id
     *                 "name": "默认-视图",                          // 元模型-视图-名称
     *                 "shortName": "默认",                          // 元模型-视图-简称
     *                 "nodeTotal": 0,                               // 元模型-视图-节点数量
     *                 "edgeTotal": 0,                               // 元模型-视图-边数量
     *                 "createdTime": "2025-08-11 19:17:26",         // 元模型-视图-创建时间
     *                 "updatedTime": "2025-08-11 19:17:26"         // 元模型-视图-更新时间
     *             },....
     *         ]
     *     },
     *     "extendInfo": [
     *     ],
     *     "timeStamp": 1758584687966,
     *     "execTime": 0,
     *     "error": false
     * }
     */
    @RequestMapping("getNodeList")
    @AiSystemApiCheck
    public ApiResult getNodeList(
            @RequestParam(required = false) String metadataIds,
            @RequestParam(required = false) String metadataViewIds,
            @RequestParam(required = false) String updatedTime,
            @RequestParam(required = false, defaultValue = "1") Integer page,
            @RequestParam(required = false, defaultValue = "100") Integer pageSize,
            @RequestParam(required = false, defaultValue = "updatedTime") String sortProp,
            @RequestParam(required = false, defaultValue = "desc") String sortOrder
    ) {
        return metadataService.getNodeList(MetadataNodeListRequest.builder()
                .metadataIds(metadataIds)
                .metadataViewIds(metadataViewIds)
                .updatedTime(updatedTime)
                .page(page)
                .pageSize(pageSize)
                .sortProp(sortProp)
                .sortOrder(sortOrder)
                .build());
    }


    /**
     * @api {post} /api/ai-server/v001/Metadata/getEdgeList 04.元模型关系-列表
     * @apiName 04.元模型关系-列表
     * @apiGroup 01.元模型
     * @apiVersion 1.0.0
     *
     * @apiHeader {String} ApiKey 平台ApiKey
     * @apiHeader {String} Timestamp 时间戳
     * @apiHeader {String} Sign 请求签名
     * @apiHeader {String} Username 用户名(在后台系统查看需要开启【模型工具访问】权限)
     * @apiParam {String} [updatedTime=2025-09-23,2025-09-30] 查询时间段,格式:yyyy-MM-dd,yyyy-MM-dd(可选)
     * @apiParam {String} [metadataIds=15,16] 元模型-id列表,多个id用逗号隔开(可选)
     * @apiParam {String} [metadataViewIds=3,23] 元模型-视图-id列表,多个id用逗号隔开(可选)
     * @apiParam {String} [page=1] 页码(可选,默认:1)
     * @apiParam {String} [pageSize=100] 每页数量(可选,默认:100)
     * @apiParam {String} [sortProp=updatedTime] 排序字段:updatedTime(可选,默认:updatedTime)
     * @apiParam {String} [sortOrder=desc] 排序顺序:asc/desc(可选,默认:desc)
     *
     * @apiError {Number} code 错误码，非0表示失败
     * @apiError {String} message 错误信息
     *
     * @apiSuccessExample {json} 成功响应:
     * HTTP/1.1 200 OK
     * {
     *     "message": "",
     *     "code": 0,
     *     "data": {
     *         "total": 6,                                              // 元模型-关系-列表-总数量
     *         "deleteIdList": [],                                      // 元模型-关系-删除-id列表
     *         "list": [                                                // 元模型-关系-列表
     *             {
     *                 "id": 96,                                        // 元模型-关系-id
     *                 "metadataId": 2,                                 // 元模型-id
     *                 "metadataViewId": 4,                             // 元模型-视图-id
     *                 "source": 144,                                   // 元模型-关系-源节点-id
     *                 "target": 145,                                   // 元模型-关系-目标节点-id
     *                 "type": 1,                                       // 元模型-关系-类型
     *                 "name": "依赖",                                  // 元模型-关系-名称
     *                 "createdTime": "2025-08-17 13:45:02",            // 元模型-关系-创建时间
     *                 "updatedTime": "2025-08-17 13:45:02"             // 元模型-关系-更新时间
     *             },....
     *         ]
     *     },
     *     "extendInfo": [
     *     ],
     *     "timeStamp": 1758584985281,
     *     "execTime": 0,
     *     "error": false
     * }
     */
    @RequestMapping("getEdgeList")
    @AiSystemApiCheck
    public ApiResult getEdgeList(
            @RequestParam(required = false) String metadataIds,
            @RequestParam(required = false) String metadataViewIds,
            @RequestParam(required = false) String updatedTime,
            @RequestParam(required = false, defaultValue = "1") Integer page,
            @RequestParam(required = false, defaultValue = "100") Integer pageSize,
            @RequestParam(required = false, defaultValue = "updatedTime") String sortProp,
            @RequestParam(required = false, defaultValue = "desc") String sortOrder
    ) {
        return metadataService.getEdgeList(MetadataEdgeListRequest.builder()
                .metadataIds(metadataIds)
                .metadataViewIds(metadataViewIds)
                .updatedTime(updatedTime)
                .page(page)
                .pageSize(pageSize)
                .sortProp(sortProp)
                .sortOrder(sortOrder)
                .build());
    }


}
